#include "ringbuffer.h"

//typedef struct _ringbuffer_t
//{
//	volatile unsigned int read_index;           /* 当前读位置 */
//	volatile unsigned int write_index;          /* 当前写位置 */  
//	unsigned int buffer_size;					/* ringbuffer大小 */
//  unsigned char *buffer_ptr;  				/* 指向ringbuffer */
//}ringbuffer_t;

ringbuffer_t ringbuffer;
/*
 * 函数作用 : 初始化ringbuffer结构体（句柄）
 * 参数  rb   : 指向ringbuffer句柄
 * 参数  pool : 指向ringbuffer缓冲区，用户调用时一般提供一个数组
 * 参数  size : 缓冲区的大小 
 * 返回值 : 无
 */
void ringbuffer_init(ringbuffer_t *rb, unsigned char *pool, unsigned int size)
{
    /* initialize read and write index */
    rb->read_index = 0;
    rb->write_index = 0;

    /* set buffer pool and size */
    rb->buffer_ptr = pool;
    rb->buffer_size = size;
}

/*
 * 函数作用 : 向目标缓冲区写入一个字节数据
 * 参数  ch : 要写入ringbuffer的数据
 * 参数  rb : 指向ringbuffer句柄
 * 返回值   : 写入成功返回0，失败返回-1
 */
int ringbuffer_write(unsigned char ch, ringbuffer_t *rb)
{
    if (rb->read_index == ((rb->write_index + 1) % rb->buffer_size))
    {
        return -1;
    }
    else
    {
        rb->buffer_ptr[rb->write_index] = ch;
        rb->write_index = (rb->write_index + 1) % rb->buffer_size;
        return 0;
    }
}



/*
 * 函数作用 : 向目标缓冲区读取一个字节数据
 * 参数  ch : 把读取到的数据保存到ch所指向的内存
 * 参数  rb : 指向ringbuffer句柄
 * 返回值   : 读取成功返回0，失败返回-1
 */
int ringbuffer_read(unsigned char *ch, ringbuffer_t *rb)
{
    if (rb->read_index == rb->write_index)
    {
        return -1;
    }
    else
    {
        *ch = rb->buffer_ptr[rb->read_index];
        rb->read_index = (rb->read_index + 1) % rb->buffer_size;
        return 0;
    }
}


